home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / programming / other / python-1.52 / lib / python1.5 / netrc.py < prev    next >
Text File  |  1999-06-14  |  4KB  |  93 lines

  1. # Module and documentation by Eric S. Raymond, 21 Dec 1998 
  2.  
  3. import sys, os, string, shlex
  4.  
  5. class netrc:
  6.     def __init__(self, file=None):
  7.         if not file:
  8.             file = os.path.join(os.environ['HOME'], ".netrc")
  9.         try:
  10.             fp = open(file)
  11.         except:
  12.             return None
  13.         self.hosts = {}
  14.         self.macros = {}
  15.         lexer = shlex.shlex(fp)
  16.         lexer.wordchars = lexer.wordchars + '.'
  17.         while 1:
  18.             # Look for a machine, default, or macdef top-level keyword
  19.             toplevel = tt = lexer.get_token()
  20.             if tt == '' or tt == None:
  21.                 break
  22.             elif tt == 'machine':
  23.                 entryname = lexer.get_token()
  24.             elif tt == 'default':
  25.                 entryname = 'default'
  26.             elif tt == 'macdef':        # Just skip to end of macdefs
  27.                 entryname = lexer.get_token()
  28.                 self.macros[entryname] = []
  29.                 lexer.whitepace = ' \t'
  30.                 while 1:
  31.                     line = lexer.instream.readline()
  32.                     if not line or line == '\012' and tt == '\012':
  33.                         lexer.whitepace = ' \t\r\n'
  34.                         break
  35.                     tt = line
  36.                     self.macros[entryname].append(line)
  37.             else:
  38.                 raise SyntaxError, "bad toplevel token %s, file %s, line %d" \
  39.                             % (tt, file, lexer.lineno) 
  40.  
  41.             # We're looking at start of an entry for a named machine or default.
  42.             if toplevel == 'machine':
  43.                 login = account = password = None
  44.                 self.hosts[entryname] = {}
  45.             while 1:
  46.                 tt = lexer.get_token()
  47.                 if tt=='' or tt == 'machine' or tt == 'default' or tt == 'macdef':
  48.                     if toplevel == 'macdef':
  49.                         break;
  50.                     elif login and password:
  51.                         self.hosts[entryname] = (login, account, password)
  52.                         lexer.push_token(tt)
  53.                         break
  54.                     else:
  55.                         raise SyntaxError, "malformed %s entry %s terminated by %s" % (toplevel, entryname, repr(tt))
  56.                 elif tt == 'login' or tt == 'user':
  57.                     login = lexer.get_token()
  58.                 elif tt == 'account':
  59.                     account = lexer.get_token()
  60.                 elif tt == 'password':
  61.                     password = lexer.get_token()
  62.                 else:
  63.                     raise SyntaxError, "bad follower token %s, file %s, line %d"%(tt,file,lexer.lineno)
  64.  
  65.     def authenticators(self, host):
  66.         "Return a (user, account, password) tuple for given host."
  67.         if self.hosts.has_key(host):
  68.             return self.hosts[host]
  69.         elif self.hosts.has_key('default'):
  70.             return self.hosts['default']
  71.         else:
  72.             return None
  73.  
  74.     def __repr__(self):
  75.         "Dump the class data in the format of a .netrc file"
  76.         rep = ""
  77.         for host in self.hosts.keys():
  78.             attrs = self.hosts[host]
  79.             rep = rep + "machine "+ host + "\n\tlogin " + repr(attrs[0]) + "\n"
  80.             if attrs[1]:
  81.                 rep = rep + "account " + repr(attrs[1])
  82.             rep = rep + "\tpassword " + repr(attrs[2]) + "\n"
  83.         for macro in self.macros.keys():
  84.             rep = rep + "macdef " + macro + "\n"
  85.             for line in self.macros[macro]:
  86.                 rep = rep + line
  87.             rep = rep + "\n"
  88.         return rep
  89.  
  90. if __name__ == '__main__': 
  91.     print netrc()
  92.  
  93.